package love.utils;

import java.text.DecimalFormat;
import java.text.ParseException;

/**
 * Classe outils pour manipuler des nombres
 * 
 * @author jonathan
 *
 */
public class NumericTools {

	private static DecimalFormat money_format = new DecimalFormat("#0.00 '€'");
	
	/**
	 * Parse la chaine en double et le renvoi.
	 * Renvoi 0.0d si la chaine ne peut être parsée.
	 * 
	 * @deprecated use parseDouble
	 * @param string
	 * @return
	 */
	public static double doubleFromString(String string) {
		if(string == null) 
			return 0.0;
		double d;
		try {
			d = Double.valueOf(string);
		} catch (NumberFormatException e) {
			d = 0.0;
		}
		return d;
	}
	
	/**
	 * Parse la chaine en int et le renvoi.
	 * Renvoi 0 si la chaine ne peut être parsée.
	 * 
	 * @deprecated use parseInteger
	 * @param string
	 * @return
	 */
	public static int intFromString(String string) {
		if(string == null) 
			return 0;
		int i;
		try {
			i = Integer.valueOf(string);
		} catch (NumberFormatException e) {
			i = 0;
		}
		return i;
	}
	
	/**
	 * Fonction qui renvoie, en fonction de la valeur mask, le nombre de bits qui sont à 1
	 * exemple: mask = 28 => 0 1 1 1 0 valeur de retour = 3
	 * @param mask
	 * @return
	 */
	public static int getNombreBitsUp(int mask){
		int nbBitsA1 = 0;
		do{
			nbBitsA1 += mask%2 ;
			mask /= 2;
		}while(mask > 0);
		
		return nbBitsA1;
	}
	
	/**
	 * Renvoi une chaine de caractères de "d" arrondie à "decimal" chiffre après la virgule.
	 * 
	 * @param d
	 * @param decimal
	 * @return
	 */
	public static String formatDouble(double d, int decimal) {
		if(Double.isNaN(d))
			return "-";
		StringBuilder format = new StringBuilder("#0.");
		for(int i = 0; i < decimal; i++) {
			format.append('0');
		}
		DecimalFormat df = new DecimalFormat(format.toString());
		return df.format(d);
	}
	
	public static boolean isDouble(String value){
//		if(value.equals("0.0"))
//			return true;
//		
//		return parseDouble(value) != 0.0;
		try{
			Double.valueOf(value);
			return true;
		}catch(Exception e){
			return false;
		}
	}
	
	public static boolean isInteger(String value){
		try {
			Integer.valueOf(value);
			return true;
		} catch (NumberFormatException e) {
			return false;
		}
	}

	/**
	 * Renvoi une chaine de caractères de "d" arrondie à 3 chiffres après la virgule.
	 * 
	 * @param d
	 * @return
	 */
	public static String formatDouble(double d) {
		return formatDouble(d, 3);
	}
	
	/**
	 * 
	 * @param d
	 * @return
	 */
	public static String[] formatDoubles(double[] d, int decimals) {
		String[] strs = new String[d.length];
		for (int i = 0; i < d.length; i++) {
			strs[i] = formatDouble(d[i], decimals);
		}
		return strs;
	}
	
	/**
	 * 
	 * @param d
	 * @return
	 */
	public static String[] formatDoubles(double[] d) {
		String[] strs = new String[d.length];
		for (int i = 0; i < d.length; i++) {
			strs[i] = formatDouble(d[i]);
		}
		return strs;
	}
	
	/**
	 * Parse la chaine en double et le renvoi.
	 * Renvoi 0.0d si la chaine ne peut être parsée.
	 * 
	 * @param string
	 * @return
	 */
	public static double parseDouble(String string) {
		if(string == null) {
			return 0.0;
		}
		StringBuilder format = new StringBuilder("#0.");
		DecimalFormat df = new DecimalFormat(format.toString());
		try {
			return df.parse(string.replace(".", ",")).doubleValue();
		} catch (ParseException e) {
			return 0.0;
		}
	}

	public static String formatInteger(int i) {
		return Integer.toString(i);
	}
	
	public static int parseInteger(String string) {
		return intFromString(string);
	}

	
	public static String formatMoney(double prix) {
		if(Double.isNaN(prix))
			return "- €";
		return money_format.format(prix);
	}
	
	public static double parseMoney(String prix) {
		try {
			return money_format.parse(prix.replace(".", ",")).doubleValue();
		} catch (ParseException e) {
			return 0;
		}
	}
	
}
